package interceptcrossing;

/**
 * Точка на двумерной плоскости. Определяется значением координат по оси абсцисс
 * и ординат
 *
 * @author Igor Botyan
 */
public class Point implements Comparable<Point> {

	private double x;
	private double y;

	/**
	 * Создание точки
	 *
	 * @param x значение координаты по оси абсцисс
	 * @param y значение координаты по оси ординат
	 */
	public Point(double x, double y) {
		this.x = x;
		this.y = y;
	}

	/**
	 * Получение значения координаты по оси абсцисс
	 *
	 * @return значение координаты по оси абсцисс
	 */
	public double x() {
		return this.x;
	}

	/**
	 * Получение значения координаты по оси ординат
	 *
	 * @return значение координаты по оси ординат
	 */
	public double y() {
		return this.y;
	}

	/**
	 * Вычисление расстояния до заданной точки
	 *
	 * @param point заданная точка
	 * @return расстояние до заданной точки
	 */
	public double distanceTo(Point point) {
		double xDiff = (this.x - point.x);
		double yDiff = (this.y - point.y);

		return Math.sqrt(xDiff * xDiff + yDiff * yDiff);
	}

	@Override
	public boolean equals(Object obj) {
		boolean ret = false;

		if (obj instanceof Point) {
			Point p = (Point) obj;
			ret = (this.x == p.x && this.y == p.y);
		}

		return ret;
	}

	@Override
	public int hashCode() {
		int hash = 7;

		hash = 11 * hash + (int) (Double.doubleToLongBits(this.x)
			^ (Double.doubleToLongBits(this.x) >>> 32));
		hash = 11 * hash + (int) (Double.doubleToLongBits(this.y)
			^ (Double.doubleToLongBits(this.y) >>> 32));

		return hash;
	}

	public int compareTo(Point o) {
		int ret = Double.compare(this.x, o.x);

		if (ret == 0) {
			ret = Double.compare(this.y, o.y);
		}

		return ret;
	}

	@Override
	public String toString() {
		return String.format("(%.2f ; %.2f)", this.x, this.y);
	}
}
